package com.zpark.it.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zpark.it.param.ProductHotParam;
import com.zpark.it.param.ProductIdsParam;
import com.zpark.it.param.ProductSaveParam;
import com.zpark.it.param.ProductSearchParam;
import com.zpark.it.pojo.Product;
import com.zpark.it.to.OrderToProduct;
import com.zpark.it.utils.R;

import java.util.List;

/**
 * @Title: ProductService
 * @Author Charles
 * @Package com.zpark.it.service
 * @Date 2023/7/21 15:01
 */
public interface ProductService extends IService<Product> {




    /**
     * 根据单类名称查询热门商品，至多7条数据
     * @param categoryName
     * @return
     */
    R promo(String categoryName);

    /**
     * 多类别热门商品查询，根据类别名称集合！最后查询7条数据
     * @param productHotParam
     * @return
     */
    R hots(ProductHotParam productHotParam);

    /**
     * 查询类别商品集合
     * @return
     */
    R clist();


    /**
     * 通用性的业务
     * 传入了类别id，根据id查询数据，并进行分页
     * 如果没有传入类别id，查询全部
     * @param productIdsParam
     * @return
     */
    R byCategory(ProductIdsParam productIdsParam);

    /**
     * 根据商品id查询商品详情信息
     * @param productID
     * @return
     */
    R detail(Integer productID);

    /**
     * 查询商品图片详情信息
     * @param productID
     * @return
     */
    R pictures(Integer productID);

    /**
     * 搜索服务调用，获取全部商品数据，进行数据同步
     * @return
     */
    List<Product> allList();

    /**
     * 搜索业务，需要调用搜索服务
     * @param productSearchParam
     * @return
     */

    R search(ProductSearchParam productSearchParam);

    /**
     * 根据商品id集合，查询商品集合信息
     * @param productIds
     * @return
     */
    R ids(List<Integer> productIds);

    /**
     * 根据商品id查询商品id集合，不包装
     * @param productIds
     * @return
     */
    List<Product> cartList(List<Integer> productIds);

    /**
     * 修改库存和增加销售量
     * @param orderToProducts
     */
    void subNumber(List<OrderToProduct> orderToProducts);


    /**
     * 类别对应的商品数量查询
     * @param categoryId
     */
    Long adminCount(Integer categoryId);

    /**
     * 商品保存
     * @param productSaveParam
     * @return
     */
    R adminSave(ProductSaveParam productSaveParam);

    /**
     * g更新商品
     * @param product
     * @return
     */
    R adminUpdate(Product product);

    /**
     * 商品删除
     * @param productId
     * @return
     */
    R adminRemove(Integer productId);
}
